package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Producto;
import com.ingenio.business.Proveedor;
import com.ingenio.business.Localidad;
import com.ingenio.business.EstadoProveedor;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class ProveedorAdapter extends Adapter{
	
	public Proveedor devolverProveedor(Integer id) throws Exception{
    	Connection conn = null;
    	Proveedor p = null;
    	LocalidadAdapter la = new LocalidadAdapter();
    	Localidad l = null;
    	EstadoProveedorAdapter epa = new EstadoProveedorAdapter();
    	EstadoProveedor ep = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT descProveedor,IdEstadoProveedor,IdLocalidad,calleDirProveedor,nroExteriorDirProveedor,nroInteriorDirProveedor,telefonoProveedor,faxProveedor,emailProveedor FROM proveedor WHERE IdProveedor = ? and provHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, id);
    		
    		ResultSet result = stmt.executeQuery();
    		
    		if(result.next()){
    			Integer idLocalidad = result.getInt("IdLocalidad");
    			Integer idEstadoProveedor = result.getInt("IdEstadoProveedor");
    			String descProveedor = result.getString("descProveedor");
    			String calle = result.getString("calleDirProveedor");
    			String nroExterior = result.getString("nroExteriorDirProveedor");
    			String nroInterior = result.getString("nroInteriorDirProveedor");
    			String telefono = result.getString("telefonoProveedor");
    			String fax = result.getString("faxProveedor");
    			String email = result.getString("emailProveedor");
    			l = la.devolverLocalidad(idLocalidad);
    			ep = epa.devolverEstadoProveedor(idEstadoProveedor);
    			p = new Proveedor(id, descProveedor, ep, l, calle, nroExterior, nroInterior, telefono, fax, email, true);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
		return p;
    }
	
	public List<Proveedor> devolverProveedores() throws Exception{
    	Connection conn = null;
    	List<Proveedor> proveedores = new ArrayList<Proveedor>();
    	LocalidadAdapter la = new LocalidadAdapter();
		Localidad l = null;
		EstadoProveedorAdapter epa = new EstadoProveedorAdapter();
		EstadoProveedor ep = null;
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
    		Proveedor p = null;
    		String sel ="SELECT IdProveedor,descProveedor,IdEstadoProveedor,IdLocalidad,calleDirProveedor,nroExteriorDirProveedor,nroInteriorDirProveedor,telefonoProveedor,faxProveedor,emailProveedor FROM proveedor WHERE provHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){    			
    			Integer idProveedor = result.getInt("IdProveedor");
    			Integer idLocalidad = result.getInt("IdLocalidad");
    			Integer idEstadoProveedor = result.getInt("IdEstadoProveedor");
    			String descProveedor = result.getString("descProveedor");
    			String calle = result.getString("calleDirProveedor");
    			String nroExterior = result.getString("nroExteriorDirProveedor");
    			String nroInterior = result.getString("nroInteriorDirProveedor");
    			String telefono = result.getString("telefonoProveedor");
    			String fax = result.getString("faxProveedor");
    			String email = result.getString("emailProveedor");
    			l = la.devolverLocalidad(idLocalidad);
    			ep = epa.devolverEstadoProveedor(idEstadoProveedor);
    			p = new Proveedor(idProveedor, descProveedor, ep, l, calle, nroExterior, nroInterior, telefono, fax, email, true);
    			proveedores.add(p);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return proveedores;
    }
	
	public void agregarProveedor(Proveedor p,List<Producto> productos) throws Exception {
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
	    	conn = (Connection) abrirConexion();
	    	String add = "INSERT INTO proveedor(descProveedor,IdEstadoProveedor,IdLocalidad,calleDirProveedor,nroExteriorDirProveedor,nroInteriorDirProveedor,telefonoProveedor,faxProveedor,emailProveedor,provHabilitado) " + 
	    				"VALUES (?,1,?,?,?,?,?,?,?,1)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			stmt.setString(1, p.getDescProveedor());
			stmt.setInt(2, p.getLocalidad().getIdLocalidad());
			stmt.setString(3, p.getCalle());
			stmt.setString(4, p.getNroExterior());
			stmt.setString(5, p.getNroInterior()!="" ? p.getNroInterior() : null);
			stmt.setString(6, p.getTelefono()!="" ? p.getTelefono() : null);
			stmt.setString(7, p.getFax()!="" ? p.getFax() : null);
			stmt.setString(8, p.getEmail()!="" ? p.getEmail() : null);
	    	stmt.execute();
	    	ResultSet rs = stmt.getGeneratedKeys();
			if (rs.next()) {
			    Integer id = rs.getInt(1);
			    p.setIdProvedoor(id);
			    this.relacionProductoProveedor(p, productos, conn);
			}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
	}
	
	public void eliminarProveedor(Proveedor p) throws Exception {
		Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String del = "UPDATE proveedor SET provHabilitado = 0 WHERE IdProveedor = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(del);
	    	stmt.setInt(1, p.getIdProvedoor());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
	}
	
	public void modificarProveedor(Proveedor p,List<Producto> productos) throws Exception {
		Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String upd = "UPDATE proveedor SET descProveedor = ?, IdEstadoProveedor = ?, IdLocalidad = ?, calleDirProveedor = ?, nroExteriorDirProveedor = ?, nroInteriorDirProveedor = ?, telefonoProveedor = ?, faxProveedor = ?, emailProveedor = ? WHERE IdProveedor = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(upd);
	    	stmt.setString(1, p.getDescProveedor());
	    	stmt.setInt(2, p.getEstadoProveedor().getIdEstadoProveedor());
	    	stmt.setInt(3, p.getLocalidad().getIdLocalidad());
	    	stmt.setString(4, p.getCalle());
	    	stmt.setString(5, p.getNroExterior());
	    	stmt.setString(6, p.getNroInterior()!="" ? p.getNroInterior() : null);
	    	stmt.setString(7, p.getTelefono()!="" ? p.getTelefono() : null);
	    	stmt.setString(8, p.getFax()!="" ? p.getFax() : null);
	    	stmt.setString(9, p.getEmail()!="" ? p.getEmail() : null);
	    	stmt.setInt(10, p.getIdProvedoor());
			stmt.execute();
			
			this.relacionProductoProveedor(p, productos, conn);
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
	}
	

	public void relacionProductoProveedor(Proveedor p, List<Producto> productos, Connection conn) throws Exception{
		PreparedStatement stmt = null;
		this.eliminarRelProdProv(p, conn);
		String add = "INSERT INTO proveedor_producto(IdProveedor,IdProducto) " +
				"VALUES (?,?)";
		stmt = (PreparedStatement) conn.prepareStatement(add);
		Integer idproveedor = p.getIdProvedoor();
		for (Producto producto : productos) {
			stmt.setInt(1,idproveedor);
			stmt.setString(2,producto.getIdProducto());
			stmt.execute();
		}
	}
	
	public void eliminarRelProdProv(Proveedor p,Connection conn) throws Exception{
		PreparedStatement stmt = null;
	    String del = "DELETE FROM proveedor_producto WHERE IdProveedor = ?";
	    stmt = (PreparedStatement) conn.prepareStatement(del);
	    stmt.setInt(1, p.getIdProvedoor());
		stmt.execute();
	}
	
	public List<Proveedor> buscarProveedor(String desc) throws Exception{
    	Connection conn = null;
    	List<Proveedor> proveedores = new ArrayList<Proveedor>();
    	Proveedor p = null;
    	LocalidadAdapter la = new LocalidadAdapter();
    	Localidad l = null;
    	EstadoProveedorAdapter epa = new EstadoProveedorAdapter();
    	EstadoProveedor ep = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT IdProveedor,descProveedor,IdEstadoProveedor,IdLocalidad,calleDirProveedor,nroExteriorDirProveedor,nroInteriorDirProveedor,telefonoProveedor,faxProveedor,emailProveedor FROM proveedor WHERE descProveedor LIKE ? and provHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setString(1, "%" + desc + "%");
    		
    		ResultSet result = stmt.executeQuery();
    		
    		while(result.next()){
    			Integer idLocalidad = result.getInt("IdLocalidad");
    			Integer idEstadoProveedor = result.getInt("IdEstadoProveedor");
    			Integer idProveedor = result.getInt("IdProveedor");
    			String descProveedor = result.getString("descProveedor");
    			String calle = result.getString("calleDirProveedor");
    			String nroExterior = result.getString("nroExteriorDirProveedor");
    			String nroInterior = result.getString("nroInteriorDirProveedor");
    			String telefono = result.getString("telefonoProveedor");
    			String fax = result.getString("faxProveedor");
    			String email = result.getString("emailProveedor");
    			l = la.devolverLocalidad(idLocalidad);
    			ep = epa.devolverEstadoProveedor(idEstadoProveedor);
    			p = new Proveedor(idProveedor, descProveedor, ep, l, calle, nroExterior, nroInterior, telefono, fax, email, true);
    			proveedores.add(p);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
		return proveedores;
    }
}
